
#include "nane/core/stackstring.h"
#include "nane/core/crt/OutputLogger.h"
#include "nane/core/crt/Time.h"
#include <cassert>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    OutputLogger::OutputLogger( IOutput* _output )
        : m_output( _output )
    {
        assert( m_output != NULL && "Output must be valid" );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    OutputLogger::~OutputLogger()
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void OutputLogger::Log( const char* _message, const char* _file, const char* _line
                          , const char* _function, ELogMessageLevel::raw_type _messageLevel )
    {
        StackString<512> buffer;
        if( _messageLevel < ELogMessageLevel::Info )
        {
            buffer.assign("[%1] %2: (%3:%4 '%5') %6\n")
                    << Time::GetLocalTime()
                    << ELogMessageLevel::toString(enum_cast<ELogMessageLevel>(_messageLevel))
                    << _file
                    << _line
                    << _function
                    << _message;
        }
        else
        {
            buffer.assign("[%1] %2: %3\n")
                    << Time::GetLocalTime()
                    << ELogMessageLevel::toString(enum_cast<ELogMessageLevel>(_messageLevel))
                    << _message;
        }
        m_output->Write(reinterpret_cast<const byte*>(buffer.begin()), buffer.size());
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
